package navigation

import (
	"fmt"

	appErrors "BookStack/pkg/errors"
)

// ========================== 导航相关错误 ==========================
// 导航不存在错误
func NavigationNotFound(id interface{}) error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeNavigationNotFound,
		Message: fmt.Sprintf("导航不存在: %v", id),
	}
}

// 导航名称已存在错误
func NavigationNameExists(name string, position string) error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeNavigationNameExists,
		Message: fmt.Sprintf("导航名称'%s'在位置'%s'中已存在，请使用其他名称", name, position),
		Details: map[string]interface{}{
			"name":     name,
			"position": position,
		},
	}
}

// 导航URL已存在错误
func NavigationURLExists(url string, position string) error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeNavigationURLExists,
		Message: fmt.Sprintf("导航URL'%s'在位置'%s'中已存在，请使用其他URL", url, position),
		Details: map[string]interface{}{
			"url":      url,
			"position": position,
		},
	}
}

// 导航位置无效错误
func NavigationPositionInvalid(position string) error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeNavigationPositionInvalid,
		Message: "无效的导航位置",
		Details: map[string]interface{}{
			"position": position,
		},
	}
}

// 批量排序失败错误
func NavigationBatchOrderFailed(err error) error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeNavigationBatchOrderFailed,
		Message: "导航批量排序失败",
		Details: map[string]interface{}{
			"reason": err.Error(),
		},
	}
}

// 父导航不存在错误
func NavigationParentNotFound(parentID uint) error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeNavigationParentNotFound,
		Message: fmt.Sprintf("父导航不存在: %d", parentID),
		Details: map[string]interface{}{
			"parent_id": parentID,
		},
	}
}

// ========================== 通用错误 ==========================

// DatabaseError 数据库错误
func DatabaseError(err error) error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeDatabase,
		Message: err.Error(),
	}
}

// ValidationError 数据验证错误
func ValidationError(field, message string) error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeValidation,
		Message: fmt.Sprintf("字段 %s: %s", field, message),
	}
}

// InvalidRequestError 无效请求错误
func InvalidRequestError(message string) error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeBadRequest,
		Message: message,
	}
}

// UnauthorizedError 未授权错误
func UnauthorizedError() error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeUnauthorized,
		Message: "未授权访问",
	}
}

// ForbiddenError 禁止访问错误
func ForbiddenError() error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeForbidden,
		Message: "无权限执行此操作",
	}
}

// InternalError 内部服务器错误
func InternalError(err error) error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeInternal,
		Message: err.Error(),
	}
}

// WrapError 包装错误
func WrapError(err error) error {
	if err == nil {
		return nil
	}

	// 如果已经是AppError类型，直接返回
	if appErr, ok := err.(*appErrors.AppError); ok {
		return appErr
	}

	// 包装为内部错误
	return InternalError(err)
}
